/**
 * @file Poll.h
 * @author Lost
 * @date 五月 2018
 * @brief 
 * 轮询基类
 */

#ifndef __POLL_H__
#define __POLL_H__

/**
 * @brief 套接字事件类型
 */
enum ESocketEventType
{
    /*!< 无事件 */
    ENM_SOCKET_EVENT_TYPE_NONE = 0,
    /*!< 读事件掩码 */
    ENM_SOCKET_EVENT_TYPE_READ_MASK = 15,//0x0f
    /*!< 读事件 */
    ENM_SOCKET_EVENT_TYPE_READ = 1,
    /*!< 连接事件 */
    ENM_SOCKET_EVENT_TYPE_ACCEPT = 2,

    /*!< 写事件掩码 */
    ENM_SOCKET_EVENT_TYPE_WRITE_MASK = 240,//0xf0
    /*!< 连接事件 */
    ENM_SOCKET_EVENT_TYPE_CONNECT = 16,
    /*!< 写事件 */
    ENM_SOCKET_EVENT_TYPE_WRITE = 32,
    /*!< 全事件 */
    ENM_SOCKET_EVENT_TYPE_ALL = 255,//0xff
};

/**
 * @brief 套接字就绪事件类型
 */
enum ESocketReadyEventType
{
    /*!< 读事件 */
    ENM_SOCKET_READY_EVENT_TYPE_READ = 1,

    /*!< 写事件 */
    ENM_SOCKET_READY_EVENT_TYPE_WRITE = 2,
};
/**
 * @brief 就绪套接字
 */
typedef struct stReadySocket
{
    /*!< 套接字 */
    int iSocket;

    /*!< 就绪事件 */
    ESocketReadyEventType eType;
}SReadySocket;

/**
 * @brief 轮询基类
 */
class CPoll
{
public:
    CPoll();
    ~CPoll();
public:
    /**
     * @brief 初始化
     */
    virtual bool Init(const int iReadySize);

    /**
     * @brief 获取就绪套接字
     */
    const SReadySocket *GetReadySocket();

    /**
     * @brief 移除套接字
     */
    void PopReadySocket();

protected:
    /**
     * @brief 添加就绪套接字
     */
    bool AddReadySocket(const int iSocket, const ESocketReadyEventType eType);

public:
    /**
     * @brief 添加套接字
     */
    virtual bool AddReadSocket(const int iSocket) = 0;

    /**
     * @brief 删除套接字
     */
    virtual void RemoveReadSocket(const int iSocket) = 0;

    /**
     * @brief 添加套接字
     */
    virtual bool AddWriteSocket(const int iSocket) = 0;

    /**
     * @brief 删除套接字
     */
    virtual void RemoveWriteSocket(const int iSocket) = 0;

    /**
     * @brief 检测网络事件
     */
    virtual int Polling(int iWaitTime) = 0;

    /**
     * @brief 获取名字
     */
    virtual const char *GetName() = 0;

private:
    /*!< 就绪套接字总大小 */
    int m_iMaxReadySokcketSize;

    /*!< 就绪套接字大小 */
    int m_iReadySokcketSize;

    /*!< 就绪套接字数组 */
    SReadySocket *m_pReadySocket;
};




#endif // __POLL_H__
